﻿using System;
using System.Collections.Generic;
using System.Device.Location;
using System.Linq;
using System.Windows;
using System.Windows.Media.Imaging;
using Microsoft.Phone.Controls;

namespace HCMUS_SearchService_Group2
{
    /////////////////////////////////////////////////
    /// \brief Giao diện hiển thị danh sách kết quả.
    /// \author Ngô Trọng Nghĩa -   0912305.
    /// \details <h3>Hiển thị danh sách kết quả và xử lý tương tác</h3>
    ////////////////////////////////////////////////
    public partial class DetailResultPage : PhoneApplicationPage
    {
        private int index;
        private float scope;
        /////////////////////////////////////////////////
        /// \brief Hàm khởi tạo.
        /// \param[in] Không
        /// \param[out] Không
        /// \returns Không
        /// \details <h3>Khởi tạo các biến và các components</h3>
        /////////////////////////////////////////////////

        public DetailResultPage()
        {
            InitializeComponent();
            this.scope = 1000;
            this.selectedScope.Items.Add("500");
            this.selectedScope.Items.Add("1000");
            this.selectedScope.Items.Add("1500");
            this.selectedScope.Items.Add("2000");
        }

        /////////////////////////////////////////////////
        /// \brief Hàm bắt sự kiện chuyển trang.
        /// \param[in] NavigationEventArgs
        /// \param[out] Không
        /// \returns Không
        /// \details <h3>Hiển thị trang với chi tiết của dịch vụ được chọn từ ListlResultPage/h3>
        /////////////////////////////////////////////////

        protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
        {
            base.OnNavigatedTo(e);
            string result = string.Empty;
            NavigationContext.QueryString.TryGetValue("result", out result);
            this.index = Convert.ToInt32(result);
            this.Txt_Address.Text = MainPage.result[this.index].Address;
            this.Txt_Name.Text = MainPage.result[this.index].LocationName;
            this.Img_Logo.Source = new BitmapImage(new Uri(MainPage.result[this.index].SourceImgService, UriKind.Relative));
            BitmapImage temp = new BitmapImage(new Uri(MainPage.result[this.index].SourceMap, UriKind.Relative));
            this.Img_Address.Source = temp;
        }

        /////////////////////////////////////////////////
        /// \brief Hàm bắt lệnh khi nhấn vào icon trên ApplicationBar.
        /// \param[in] object
        /// \param[in] EventArgs
        /// \param[out] Không
        /// \returns Không
        /// \details <h3>Bắt lệnh khi nhấn vào icon có chức năng Back. </h3>
        /////////////////////////////////////////////////
        private void BackApplicationBarIconButton_Click(object sender, EventArgs e)
        {
            /// \see GoBack()
            this.GoBack();
        }

        /////////////////////////////////////////////////
        /// \brief Hàm xử lý khi nhấn vào icon Back trên ApplicationBar.
        /// \param[in] Không
        /// \param[out] Không
        /// \returns Không
        /// \details <h3> Quay lại ListResultPage</h3>
        /////////////////////////////////////////////////
        private void GoBack()
        {
            this.NavigationService.GoBack();
        }

        /////////////////////////////////////////////////
        /// \brief Hàm bắt lệnh khi nhấn vào icon trên ApplicationBar.
        /// \param[in] object
        /// \param[in] EventArgs
        /// \param[out] Không
        /// \returns Không
        /// \details <h3>Bắt lệnh khi người dùng nhấn vào icon có chức năng Home. </h3>
        /////////////////////////////////////////////////
        private void HomeApplicationBarIconButton_Click(object sender, EventArgs e)
        {
            /// \see GoHome()
            this.GoHome();
        }

        /////////////////////////////////////////////////
        /// \brief Hàm xử lý khi nhấn vào icon Home trên ApplicationBar.
        /// \param[in] Không
        /// \param[out] Không
        /// \returns Không
        /// \details <h3> Quay lại MainPage</h3>
        /////////////////////////////////////////////////
        private void GoHome()
        {
            this.NavigationService.Navigate(new Uri("/MainPage.xaml", UriKind.Relative));
        }

        private void MenuApplicationBarIconButton_Click(object sender, EventArgs e)
        {
            MainPage.detailMenu = DefaultSearchEngine.GetMenu(MainPage.result[this.index]);
            if (MainPage.detailMenu.Count > 0)
                this.NavigationService.Navigate(new Uri("/DetailMenuPage.xaml", UriKind.Relative));
            else
                MessageBox.Show("Service don't have menu!");
        }

        private void SearchNearApplicationBarIconButton_Click(object sender, EventArgs e)
        {
            this.ComboBoxScope.Visibility = System.Windows.Visibility.Visible;
        }

        private void Cancel_Click(object sender, System.Windows.Input.MouseButtonEventArgs e)
        {
            this.ComboBoxScope.Visibility = System.Windows.Visibility.Collapsed;
        }

        private void selectedScope_SelectionChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e)
        {
            if (this.selectedScope.SelectedItem != null)
            {
                this.ComboBoxScope.Visibility = System.Windows.Visibility.Collapsed;
                this.scope = float.Parse(this.selectedScope.SelectedItem.ToString());
                double sLatitude = MainPage.result[this.index].ViDo;
                double sLongitude = MainPage.result[this.index].KinhDo;
                if (!(sLatitude > 90.0 || sLatitude < -90.0
                                 || sLongitude > 180.0 || sLongitude < -180.0))
                {
                    var sCood = new GeoCoordinate(sLatitude, sLongitude);

                    List<DataDTO> datas = new List<DataDTO>();
                    datas = (from info in SearchHelper.Datas
                             select info).Where((item) =>
                             {
                                 double eLatitude = item.ViDo;
                                 double eLongitude = item.KinhDo;
                                 if (eLatitude > 90.0 || eLatitude < -90.0
                                     || eLongitude > 180.0 || eLongitude < -180.0)
                                     return false;
                                 var eCood = new GeoCoordinate(item.ViDo, item.KinhDo);
                                 double distance = sCood.GetDistanceTo(eCood);
                                 if (distance <= scope)
                                     return true;
                                 return false;
                             }
                             ).ToList();
                    List<ContentDataDTO> listContent = new List<ContentDataDTO>();
                    for (int i = 0; i < datas.Count; i++)
                    {
                        /// \see SearchHelper.SearchDataByID(ContentDataDTO);
                        ContentDataDTO temp = SearchHelper.SearchDataByID(datas[i], i);
                        listContent.Add(temp);
                    }
                    if (listContent.Count > 0)
                    {
                        MainPage.result = listContent;
                        NavigationService.GoBack();
                    }
                }
                else
                    MessageBox.Show("Longitude or Latitudeth is not compatible!");
            }
        }
    }
}